import { mergeOptions } from "../utils/index";

export function initGlobalApi(Vue) {
  Vue.options = {}; // 给Vue函数上面添了一个 options 属性
  Vue.Mixin = function (mixin) {
    this.options = mergeOptions(this.options, mixin); // this指向 Vue
  }
  Vue.options.components = {}; // 用来存放全局组件
  Vue.component = function (id, componentOption) {
    // 2个参数的话，id作为组件name；1个参数对象的话，配置项里面的name作为组件name
    componentOption.name = componentOption.name || id;
    componentOption = this.extend(componentOption); // extend函数返回一个子类
    this.options.components[id] = componentOption;
    // console.log(this.options);
  }
  Vue.extend = function (options) {
    const Sub = function vueComponent(opts) {
      this._init(opts);
    }
    // 以vue实例对象的原型作为Sub的原型，这样，Sub上就有了$mount方法
    Sub.prototype = Object.create(this.prototype);
    // 因为这里直接修改了Sub的原型，所以下面需要重新指回去，否则Sub函数里面的this指向就有问题
    Sub.prototype.constructor = Sub;
    // 将父组件里面的属性合并到子组件中
    Sub.options = mergeOptions(this.options, options);
    return Sub;
  }
  Vue.use = function(plugin) {
    plugin.install(this);
  }
}